package day0220;


public class Boy {

    private String name;

    private int age;

    public Boy() {}

    public Boy(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString(){
        return super.toString() + ". boy{name = " + this.name + ", age = " + this.age + "}";
    }

    /**
     * 重写 equals 方法:
     *   自反性：对非空 x 而言, x.equals(x) 返回 true
     *   对称性：对非空 x / y 而言, x.equals(y) 的结果和 y.equals(x) 结果一样
     *   传递性：对非空 x / y / z 而言, x.equals(y) 为 true, y.equals(z) 为 true, 则 x.equals(z) 为 true
     *  一致性：对于任何非空引用值 x 和 y 而言，在不修改 equals 方法的前提下，无论调用多少次结果都一致
     *  对非空 x 而言， x.equals(null) 一定为 false
     *
     *  重写 equals 方法必须重写 hashCode()
     * @param obj
     * @return
     */
    @Override
    public boolean equals(Object obj) {
        // 对 null 返回 false
        if (obj == null) {
            return false;
        }
        // 自反性
        if (this == obj){
            return true;
        }

        /*
            自定义的内容，你认为这个对象什么情况下相等则怎么写
             一般情况下都是判断每个字段的值都一样才为 true
         */
        // obj.getClass() == Boy.class
        if (obj instanceof Boy boy) {
            return this.name.equals(boy.name) && this.age == boy.age ;
        }
        return false;
    }

    /**
     * equals 为 true hashcode 一定相同
     * hashcode 相同， equals 不一定为 true
     * @return
     */
    @Override
    public int hashCode(){
        int h = 31;
        int hash = 1;

        hash = h * hash + this.name.hashCode();
        hash = h * hash + this.age;

        return hash;
    }
}

class Child extends Boy {

    public Child() {}

    public Child(String name, int age) {
        super(name, age);
    }
}
